home *** CD-ROM | disk | FTP | other *** search
- ╔═════════════════════════════════════════════════════════════╗
- ║ ║
- ║ Características y explicaciones sobre el entorno AVISION ║
- ║ ║
- ╚════════════════╦═════════════════════════╦══════════════════╝
- ║ Anubis Software ║
- ╚═════════════════════════╝
-
-
- Se denomina entorno AVISION a las facilidades de programación que facilitan
- las librerías de Anubis Software para utilizar pantallas virtuales menus y
- forms.
-
- En realidad se trata de todo un entorno que se centra en la presentación
- de los programas de entorno de texto de forma sencilla y práctica.
-
- Las librería están escritas en C y no en C++.
-
- ┌──────────────┐
- │ Introducción │
- └──────────────┴────────────────────────────────────────────────────────────
-
- Se puede considerar un ordenador como si fuese un sistema que responde
- a ciertos eventos que se producen. Los eventos los puede producir un usuario
- o el propio ordenador.
- Por tanto, es de esperar que un programa sólo actue respondiendo a los
- eventos que se producen y el resto del tiempo no haga prácticamente nada.
-
- El entorno AVISION se encarga "esencialmente" de facilitar esta estructura
- y de tratarla de forma adecuada para que el resultado sean programas efectivos.
-
- En realidad con AVISION existen tres acontecimientos importantes que se
- consideran como eventos separados y estos son:
-
- -Se ha producido la pulsación de una tecla en el teclado. Este es el
- primer evento que se puede producir y tratar.
- -Se ha producido alguna gestión con el ratón.
- -No se ha producido ningún otro evento. Este evento es el que se denomina
- como evento vacio o de desocupación. Se trata como si fuese un evento ya que
- se puede requerir que haya rutinas que se ejecuten sin tener que estar
- activadas por ningún evento de los anteriores o simplemente que se tengan que
- ejecutar y no sepan como.
-
- Es evidente que cada uno de estos eventos activa la ejecución de una
- serie de rutinas o procedimientos que se deben tratar cuando se produce
- dicho evento.
-
- La ejecución de dichas rutinas es sencilla, se encuentran todas ellas
- agrupadas en una lista. Y ante la ejecución de un evento se activan todas
- ellas sin importar el orden en que se ejecutan las mismas. (De momento es
- asi, aunque induzca un error el hecho de que no se ejecuten ordenadamente.
- Más adelante se dará preferencia a que puedan ejecutarse de forma ordenada).
-
- Asi lo que tenemos es que podemos crear una lista de rutinas que se
- activa cuando se produce uno de los eventos mencionados anteriormente.
- No es dificil crear este tipo de lista y menos aun mantenerla.
-
- Por razones de comodidad y velocidad las listas toman forma de Pilas
- en la implementación del sistema que proporciona Avision. De esta forma
- el sistema es más sencillo y más fácil de manejar. Además se suelen tener
- siempre las mismas rutinas ejecutandose en la pila por lo que las operaciónes
- de eliminación y inserción de nuevos procedimientos no se dan casi nunca.
- Además, con el supuesto de que los procedimientos se ejecutan sin ningún
- orden predeterminado la estructura Pila ofrece todo lo necesario para la
- gestión de eventos.
-
- ┌─────────────────────────- Pila de Inserción
- (En ella se insertan subprogramas)
- │ │
- │ │
- ├────────────────────┤
- │ │
- ├────────────────────┤
- │ │
- ├────────────────────┤
- │ Procedimiento n │
- ├────────────────────┤
- │ ...... │
- ├────────────────────┤
- │ Procedimiento 2 │
- ├────────────────────┤
- │ Procedimiento 1 │
- └────────────────────┘
-
- En cualquier momento se puede añadir o sacar una rutina de la pila de
- eventos para que se pueda ejecutar o no.
-
- También es destacable la división de los eventos en dos pilas, una de
- ejecución rápida y otra de ejecución lenta. Esto se debe a que en ciertos
- puntos de un programa hay determinados algoritmos que no se deben ejecutar
- y otros que si. Por esto se han creado dos listas por evento en lugar de
- una. La lista FAST es la que se debe poder ejecutar siempre sin comprometer
- la integridad del sistema y en cambio la lista normal se ejecuta sólo si
- se esta en un punto del programa base y no en una bifurcación del mismo.
-
-
- Por otra parte, existe una serie muy completa de librerías que ayudan
- a compartir los sistemas de salida (especialmente la pantalla) que debido
- a ser un sólo dispositivo deben compartir todos los procedimientos.
-
- Si suponemos que cada subprograma ejerce de forma independiente, es necesario
- administrar los recursor 'finitos' del sistema.
-
- Normalmente se usan ventanas para que cada procedimiento individual haga
- lo que desea en su trozo de pantalla, pero también es posible que se deseen
- utilizar pantallas de uso general o ,incluso, utilizar toda la pantalla para
- su uso y después reponer los datos de nuevo.
-
- La disposición de las librerías para las presentaciones en pantalla es
- más o menos sencilla:
-
- -Se usan las librerías TEXTMODE.H y MOUSE.H para controlar la pantalla
- al más bajo nivel y el ratón también al más bajo nivel. Esto es poner
- caracteres y cadenas de carácteres en pantalla, cambiar los colores y
- controlar el cursor. Así como gestionar el ratón de la forma más sencilla.
-
- -A modo de capa inmediatamente superior se encuentra la librería
- VENTANA2.H, que proporciona la abstracción de la pantalla convirtiendola en
- la mejor alternativa de uso para las diferentes aplicaciones que se ejecutan
- sobre la misma. Este debe ser el nivel más bajo al que se pueda
- acceder directamente por los programas de aplicación y las librerías
- inmediatamente superiores. La librería es lo suficientemente extensa para
- que no haya problemas de falta de recursos. Además se apropia de la pantalla
- por completo con lo que es imposible acceder a la misma a un nivel más bajo.
- Junto con esta librería está la librería MENU.H que se encarga de gestionar
- los menus de persiana que suelen aparecer en toda aplicación que se precie.
-
- -En tercer nivel se encuentran los AVISION SERVICES, que son formas
- específicas que se usan con la pantalla y en combinación con otros recursos
- para dar más agilidad a la programación. (Los AVISION SERVICES) se componen
- de VBOTON2.H VCADENA2.H VOPCION2.H VSCROLL2.H ....
- Cabe destacar que a este nivel todo el mundo se puede programar sus propios
- servicios y que las únicas limitaciones existentes son las de la imaginación del
- programador.
-
- - En cuarto nivel se encuentran las librerias muy específicas que
- se forma exclusivamente por VFORMS2.H esta librería pretende reunir los
- AVISION SERVICES en un único conjunto y hacer de todo ello una potente opcion.
-
- -Y en último lugar se encuentran las librerías muy muy específicas como
- puedan ser librerías de TEXTO, SELECTORES, CONFIGURACIONES, ALERTAS ...
-
- A pesar de la existencia de muchos niveles, cabe destacar que las aplicaciones
- no pierden agilidad ni eficiencia puesto que hay librerías que dialogan
- exclusivamente con VENTANA2.H y también cabe destacar que el usuario sólo
- dialogará con el último nivel de la capa.
-
-
- ┌──────────────┐
- │ Las tareas │
- └──────────────┴────────────────────────────────────────────────────────────
-
- Para empezar profundizaremos de forma adecuada en la forma de gestionar
- las tareas que tiene el sistema Avision.
- Veremos como se puede hacer una programación bien diferenciada por tareas
- sin arriesgar la efectividad de las mismas y sin tener que mezclarlas en
- absoluto unas con otras.
-
- Supongamos que queremos que una tarea (programa) escriba la hora del
- sistema en una zona de la pantalla. Y que otra quiere simular un pequeño
- contador en otra parte de la pantalla.
-
- El algoritmo de la primera viene a ser algo similar a esto:
-
- void far tratareloj(void)
- {
- struct time t;
- char string[40];
- gettime(&t);
- sprintf(string, " Hora actual: %2d:%2d:%2d.%2d",t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);
- gotoxy(1,1);
- puts(string);
- }// end tratareloj
-
- Y el algoritmo de la segunda es algo como esto otro:
-
- void far tratacontador(void)
- {
- static int cont=0;
- gotoxy(30,30);
- printf("%d",contador++);
- }// end tratacontador
-
- Como se puede apreciar ambas tareas son bien diferenciadas y realizan
- cosas muy distintas. Pero si queremos crear un programa que las ejecute
- simultaneamente entonces tendremos que ir llamandolas de forma simultanea
- en un bucle que no termine nunca.
-
- La forma que propone Avision es simplemente empilarlas en una pila y
- después dejarlas en paz llamado a la rutina de ejecución de la pila.
- Las rutinas para tratar las pilas de ejecución son Idlexec, Mouse y
- tecexec.
-
- Esto es como sigue:
-
- EventEmpilaHidleRoutine(tratareloj);
- EventEmilaHiddleRoutine(tratacontador);
-
- while (!fin) {
- EventKeyboardExecution();
- EventMouseExecution();
- EventIddleExecution();
- }// end while
-
- Aunque no parezca un gran cambio a simple vista, es notable la potencia
- que se adquiere con pocas mejoras al poder llamar todas las rutinas desde
- cualquier punto del programa, (Incluso desde una librería prefabricada !!).
- Asi se puede simular algo similar a la multitarea (Aunque sólo bajo un
- programa.)
-
-
- Visto esto, ahora pensemos en la mayoria de nuestras rutinas, unas se ejecutarán
- sólo bajo la pulsación de una tecla, otras bajo la presión del botón del ratón
- otras se ejecutarán ante el movimiento del ratón y otras se estarán ejecutando
- siempre. Con una sóla pila se puede conseguir el efecto deseado siempre que
- todas las rutinas tengan una especie de condición de entrada que venga a ser
- determinar si el raton se ha movido, si se ha pulsado una tecla, ...
- Este no es un mal sistema, pero es poco eficiente en cara a que todas las
- rutinas perderán tiempo comprobando cual de los eventos se ha producido y
- si les toca activarse ante dicho evento.
- Lo cierto es que es preferible que las rutinas ya sepan de antemano que
- se ha producido el evento que las activa y que hagan directamente lo que
- tienen que hacer. Para conseguir esto no hay más que separar la pila de
- ejecución en tres sub-pilas, las cuales se ejecutan al haberse producido
- un evento determinado.
- De esta forma hay una pila para cada evento que activa determinadas
- rutinas. En Avision hay tres pilas:
- -Una que se ejecuta siempre que puede y sin esperar eventos.
- -Una que se ejecuta siempre que se ha pulsado una tecla.
- El código de la tecla está situado en una variable EventTecla.
- -Y la última que se ejecuta siempre que se produce un evento con el ratón
- Las variables mousex, mousey, evento, .... (definidas en MOUSE.H) contienen
- la información necesaria para controlar el evento que se ha producido.
-